﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Warburton.FastBitArray.Implementations;

namespace Warburton.FastBitArray.Factories
{
    internal class DefaultFactory
        : IBitArrayFactory
    {
        internal static readonly IBitArrayFactory Instance = new DefaultFactory();

        private DefaultFactory() { }

        public IBitArray BitArray(IBitArrayReadOnly bits)
        {
            var managed = bits as DefaultBitArray;
            var bitArray = (System.Collections.BitArray)null;
            if (managed != null)
                bitArray = new System.Collections.BitArray(managed.UnderlyingBitArray);
            else
            {
                bitArray = new System.Collections.BitArray(bits.NumberOfBits);
                foreach (var index in bits.GetIndexes(true))
                    bitArray.Set(index, true);
            }
            return new DefaultBitArray(this, bitArray);
        }

        public IBitArray BitArray(bool[] values)
        {
            var bitArray = new System.Collections.BitArray(values);
            return new DefaultBitArray(this, bitArray);
        }

        public IBitArray BitArray(byte[] bytes)
        {
            var bitArray = new System.Collections.BitArray(bytes);
            return new DefaultBitArray(this, bitArray);
        }

        public IBitArray BitArray(int length)
        {
            var bitArray = new System.Collections.BitArray(length);
            return new DefaultBitArray(this, bitArray);
        }

        public IBitArray BitArray(int[] values)
        {
            var bitArray = new System.Collections.BitArray(values);
            return new DefaultBitArray(this, bitArray);
        }

        public IBitArray BitArray(int length, bool defaultValue)
        {
            var bitArray = new System.Collections.BitArray(length, defaultValue);
            return new DefaultBitArray(this, bitArray);
        }
    }
}
